#ifndef XGE_COMMON_H_INCLUDED
#define XGE_COMMON_H_INCLUDED

#include <Ogre.h>

namespace XGE
{
    class Element;
    class IManager;
    class Object;
    class ObjectComponent;
    class State;
    class Overlord;

    typedef std::map<Ogre::String, XGE::IManager*> IManagerMap;
    typedef std::vector<XGE::IManager*> IManagerVec;
    typedef std::map<Ogre::String, XGE::Element*> ElementMap;

    typedef std::map<Ogre::String, XGE::Object*> ObjectMap;
    typedef std::map<Ogre::String, XGE::ObjectComponent*> ObjectComponentMap;

    typedef std::map<Ogre::String, XGE::State*> StateMap;

    namespace Quaternions
    {
        static Ogre::Quaternion X_180(0.0f, 1.0f, 0.0f, 0.0f);
        static Ogre::Quaternion Y_180(0.0f, 0.0f, 1.0f, 0.0f);
        static Ogre::Quaternion Z_180(0.0f, 0.0f, 0.0f, 1.0f);

        static Ogre::Quaternion X_90(Ogre::Math::Sqrt(0.5f), Ogre::Math::Sqrt(0.5f), 0.0f, 0.0f);
        static Ogre::Quaternion X_NEG90(Ogre::Math::Sqrt(0.5f), -Ogre::Math::Sqrt(0.5), 0.0f, 0.0f);

        static Ogre::Quaternion Y_90(Ogre::Math::Sqrt(0.5f), 0.0f, Ogre::Math::Sqrt(0.5f), 0.0f);
        static Ogre::Quaternion Y_NEG90(Ogre::Math::Sqrt(0.5f), 0.0f, -Ogre::Math::Sqrt(0.5f), 0.0f);

        static Ogre::Quaternion Z_90(Ogre::Math::Sqrt(0.5f), 0.0f, 0.0f, Ogre::Math::Sqrt(0.5f));
        static Ogre::Quaternion Z_NEG90(Ogre::Math::Sqrt(0.5f), 0.0f, 0.0f, Ogre::Math::Sqrt(0.5f));
    }
}

#endif // XGE_COMMON_H_INCLUDED
